package com.example.use_interface2do_filter.controller;

import com.example.use_interface2do_filter.domain.Banner;
import com.example.use_interface2do_filter.myinterface.BannerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @ClassName UseInterface2DoFilter
 * @Description
 * @Author huyingliang
 * @Date 2024-02-20 15:20
 */
@RestController
@RequestMapping("/useInterface2DoFilter")
public class UseInterface2DoFilter {

    /*第一种方式*/
    @Autowired
    private ApplicationContext applicationContext;

    @GetMapping("/test1")
    public String test1() {
        List<Banner> banners = new ArrayList<>();
        banners.add(new Banner("111", 1, 4));
        banners.add(new Banner("222", 2, 1));
        banners.add(new Banner("333", 1, 5));
        banners.add(new Banner("444", 2, 2));
        banners.add(new Banner("555", 1, 6));
        banners.add(new Banner("666", 2, 3));
        banners.add(new Banner("777", 1, 7));
        banners.add(new Banner("888", 2, 4));
        /*现在有很多 Banner ，然后使用我们定义出来的 BannerRule 来过滤他们*/
        /*找到所有的实现了BannerConfig接口的实现类，然后调用doFilter方法，然后返回过滤后的结果*/
        Map<String, BannerConfig> beansOfType = applicationContext.getBeansOfType(BannerConfig.class);
        Set<Map.Entry<String, BannerConfig>> entries = beansOfType.entrySet();

        for (Map.Entry<String, BannerConfig> entry : entries) {
            System.out.println("entry.getKey() = " + entry.getKey());
            BannerConfig value = entry.getValue();
            banners = value.doFilter(banners);
        }

        return "test1";
    }


    /*第二种方式--不从容器中拿，直接使用这样的方式注入，在Springboot/spring中是支持这样的方式的
     * 当发现需要的类型是 List或者Map，那么spring会自动的找到容器中所有的BannerConfig类型的实例
     * 放到bannerConfigList中*/
    @Autowired
    private List<BannerConfig> bannerConfigList;

    @GetMapping("/test2")
    public String test2() {
        List<Banner> banners = new ArrayList<>();
        banners.add(new Banner("111", 1, 4));
        banners.add(new Banner("222", 2, 1));
        banners.add(new Banner("333", 1, 5));
        banners.add(new Banner("444", 2, 2));
        banners.add(new Banner("555", 1, 6));
        banners.add(new Banner("666", 2, 3));
        banners.add(new Banner("777", 1, 7));
        banners.add(new Banner("888", 2, 4));
        /*现在有很多 Banner ，然后使用我们定义出来的 BannerRule 来过滤他们*/
        /*找到所有的实现了BannerConfig接口的实现类，然后调用doFilter方法，然后返回过滤后的结果*/
        for (BannerConfig bannerConfig : bannerConfigList) {
            banners = bannerConfig.doFilter(banners);
        }
        return "test2";
    }

    /*问题来了，如果说我们的过滤规则是完全独立的 不冲突的 那么顺序是没有意义的
     * 但是如果有优先级的问题 那么优先级怎么保证？
     * 使用 @Order(数字) 即可解决 数字越小 在数组中越靠前*/

    /*那么问题又来了 如果说对于不同的情况，过滤器还是那么几个过滤器，但是优先级不同，怎么办？
     * 也就是说 使用 @Order 之后，顺序就固定下来了 改不了了 如何能够自由的切换顺序呢？*/

}
